package com.guchenbo.example.classes;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;

public class Test {
	public static void main(String[] args) throws IOException {
		/**
		 * 1、创建类的实例 2、访问类的静态变量 (除常量【
		 * 被final修辞的静态变量】，原因:常量一种特殊的变量，因为编译器把他们当作值(value)而不是域(field)来对待。
		 * 如果你的代码中用到了常变量(constant
		 * variable)，编译器并不会生成字节码来从对象中载入域的值，而是直接把这个值插入到字节码中。这是一种很有用的优化，
		 * 但是如果你需要改变final域的值那么每一块用到那个域的代码都需要重新编译。 3、访问类的静态方法 4、反射 如(
		 * Class.forName("my.xyz.Test") ) 5、当初始化一个类时，发现其父类还未初始化，则先出发父类的初始化
		 * 6、虚拟机启动时，定义了main()方法的那个类先初始化
		 *
		 * 这6点是主动引用
		 */

		/**
		 * 1、子类调用父类的静态变量，子类不会被初始化。只有父类被初始化。 。 对于静态字段，只有直接定义这个字段的类才会被初始化.
		 * 2、通过数组定义来引用类，不会触发类的初始化
		 * 3、访问类的常量，不会初始化类
		 *
		 * 这3点为被动引用
		 */

		String cls = "C:\\Users\\CreGu\\git\\cre-parent\\cre-sample\\"
				+ "classdata\\cre\\sample\\test\\classloader\\Sample.class";

		InputStream is = new FileInputStream(new File(cls));
		ByteArrayOutputStream out = new ByteArrayOutputStream();

		byte[] b = new byte[4096];
		int r =0;

		while((r = is.read(b))!=-1){
			out.write(b, 0, r);
		}

		System.out.println(Arrays.toString(out.toByteArray()));
	}

	@org.junit.Test
	public void test1() {
		// 主动引用1
		new Sample();
	}

	@org.junit.Test
	public void test2() {
		// 主动引用2
		System.out.println(Sample.str);
	}

	@org.junit.Test
	public void test3() {
		// 主动引用3
		Sample.say();
	}

	@org.junit.Test
	public void test4() throws ClassNotFoundException {
		// 主动引用4
		Class.forName("cre.sample.test.classes.Sample");
	}

	@org.junit.Test
	public void test5() {
		// 主动引用5
		new SubSample();
	}

	@org.junit.Test
	public void test6() {
		// 主动引用6
	}
	@org.junit.Test
	public void test7() {
		// 被动引用1
		System.out.println(SubSample.str);
	}
	@org.junit.Test
	public void test10() {
		// 被动引用1
		System.out.println(SubSample.str2);
	}
	@org.junit.Test
	public void test8() {
		// 被动引用2
		SubSample[] ss = new SubSample[5];
	}
	@org.junit.Test
	public void test9() {
		// 被动引用3
		System.out.println(SubSample.INDEX);
	}
	@org.junit.Test
	public void test11() {

		new SubSample();
		new SubSample();
	}


}
